package com.truedian.wg.components.organism.dialog.internal

import com.cc.openeye.base.BasePager
import com.tencent.kuikly.core.reactive.collection.ObservableList
import com.truedian.wg.components.organism.dialogUtil.internal.DialogComponent
import com.truedian.wg.components.organism.dialogUtil.internal.DialogId


/**
 * 弹窗助手类
 *
 * 负责管理单个页面的弹窗操作，包括显示、隐藏弹窗以及弹窗堆栈的管理。
 * 该类是弹窗系统的核心组件，提供了完整的弹窗生命周期管理功能。
 *
 * ## 主要功能
 * - 显示居中和底部两种类型的弹窗
 * - 管理弹窗的显示动画和隐藏动画
 * - 维护弹窗堆栈，支持多个弹窗同时存在
 * - 提供弹窗取消功能，支持指定弹窗ID或取消最新弹窗
 * - 监控所有弹窗的取消状态
 *
 * ## 技术实现
 * - 使用[DialogStackManager]管理弹窗堆栈
 * - 通过[DialogIdHelper]生成唯一的弹窗ID
 * - 利用协程实现动画延时和状态更新
 * - 与[BasePager]的生命周期绑定
 *
 * ## 使用场景
 * 每个页面对应一个DialogHelper实例，通过[DialogHelperManager]进行统一管理。
 *
 * @param pager 关联的页面实例，用于获取生命周期作用域
 *
 * @see DialogStackManager 弹窗堆栈管理器
 * @see DialogIdHelper 弹窗ID助手
 * @see DialogHelperManager 弹窗助手管理器
 *
 * @since 1.0.0
 * @date 2025/9/9
 */
internal class DialogHelper(val pager: BasePager, dialogStack: ObservableList<DialogStackItem>) {

    private val dialogStackManager = DialogStackManager(pager, dialogStack)


    /**
     * 显示居中弹窗
     *
     * 创建一个居中显示的弹窗，使用淡入动画效果。
     *
     * @param dialogUiConfig 弹窗UI配置，包含样式、动画时间等设置
     * @param dialogComponent 弹窗内容组件
     * @return 弹窗唯一标识ID，可用于后续的取消操作
     */
    fun showCenterDialog(
        dialogUiConfig: DialogConfig,
        dialogComponent: DialogComponent
    ) = showDialog(dialogUiConfig, DialogPosition.Center, dialogComponent)

    /**
     * 显示底部弹窗
     *
     * 创建一个从底部滑入的弹窗，使用垂直滑动动画效果。
     *
     * @param dialogUiConfig 弹窗UI配置，包含样式、动画时间等设置
     * @param dialogComponent 弹窗内容组件
     * @return 弹窗唯一标识ID，可用于后续的取消操作
     */
    fun showBottomDialog(
        dialogUiConfig: DialogConfig,
        dialogComponent: DialogComponent
    ) = showDialog(dialogUiConfig, DialogPosition.Bottom, dialogComponent)

    /**
     * 显示弹窗的核心方法
     *
     * 这是一个私有方法，负责处理弹窗的创建、添加到堆栈和启动动画的核心逻辑。
     * 该方法被`showCenterDialog`和`showBottomDialog`等公共方法调用。
     *
     * ## 实现流程
     * 1. 生成唯一的弹窗ID
     * 2. 将弹窗信息添加到堆栈管理器中
     * 3. 延迟50ms后启动弹窗的入场动画
     *
     * ## 技术实现
     * - 使用`DialogIdHelper.increateDialogId()`生成唯一标识
     * - 通过`DialogStackManager`管理弹窗堆栈
     * - 利用页面的生命周期作用域启动协程处理动画
     * - 延迟启动动画确保UI渲染完成
     *
     * @param dialogUiConfig 弹窗UI配置，包含样式、动画时间、背景等设置
     * @param dialogPosition 弹窗显示位置，支持居中(Center)和底部(Bottom)两种模式
     * @param dialogComponent 弹窗内容组件，使用Compose构建的UI内容
     * @return DialogId 弹窗的唯一标识ID，用于后续的取消、查找等操作
     *
     * @see DialogIdHelper.generateDialogId 生成弹窗ID
     * @see DialogStackManager.addDialog 添加弹窗到堆栈
     * @see DialogPosition 弹窗位置枚举
     * @see DialogConfig 弹窗配置类
     *
     * @since 1.0.0
     */
    private fun showDialog(
        dialogUiConfig: DialogConfig,
        dialogPosition: DialogPosition,
        dialogComponent: DialogComponent
    ): DialogId {
        val dialogId = DialogIdHelper.generateDialogId()
        dialogStackManager.addDialog(
            dialogId,
            dialogPosition,
            dialogUiConfig,
            dialogComponent
        )
        return dialogId
    }


    /**
     * 取消弹窗
     *
     * 隐藏指定的弹窗或最新显示的弹窗。弹窗会先播放隐藏动画，
     * 动画完成后从堆栈中移除。
     *
     * @param dialogId 要取消的弹窗ID，为null时取消最新的弹窗
     */
    fun cancelAnim(dialogId: DialogId? = null) {
        val dialog = dialogStackManager.getDialog(dialogId)
        dialog?.internalDialogItemView?.animated = false
    }

    fun cancelDialog(dialogId: DialogId? = null) {
        dialogStackManager.removeDialog(dialogId)
    }


    companion object {
        const val DIALOG_ID_NONE_DIALOG_HELPER = 0 // dialogHelper不存在

    }
}